﻿Imports Entities
Imports Business
Imports Microsoft.Office.Interop

Public Class ListadoGeneral
    Private _Lista As New List(Of VentaLG)

    Private Sub bCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bCancelar.Click
        Me.Dispose()
    End Sub

    Sub CargarLista()
        _Lista = VentaBL.ListGeneral(tFechaInicio.Value, tFechaFin.Value)
        If IsNothing(_Lista) Then
            Util.Mensaje("No Existen Ventas Según los filtros Seleccionados")
        End If
    End Sub

    Private Sub bExcel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bExcel.Click
        CargarLista()
        If IsNothing(_Lista) Then
            Util.Mensaje("No Existen Ventas Según los filtros Seleccionados")
            Exit Sub
        End If

        Dim objLibroExcel As Excel.Workbook
        Dim hoja As Excel.Worksheet
        Dim m_Excel = New Excel.Application

        'Dim OldCultureInfo As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
        'System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("es-ES")

        objLibroExcel = m_Excel.Workbooks.Add() '' Creamos una instancia del Workbooks de Excel
        hoja = CType(objLibroExcel.Worksheets(1), Excel.Worksheet)  '' Creamos una instancia de la primera hoja de trabajo de Excel
        hoja.Visible = Excel.XlSheetVisibility.xlSheetVisible
        '' Hacemos esta hoja la visible en pantalla
        '' (como seleccionamos la primera esto no es necesario
        '' si seleccionamos una diferente a la primera si lo
        '' necesitaríamos, esto lo hacemos como forma de mostrar como   cambiar de entre hojas en un documento Excel).
        hoja.Activate()
        '' Crear el encabezado de nuestro informe
        hoja.Range("B2:h2").Merge()
        hoja.Range("B2:h2").Value = "Listado General de Ventas Entre " + tFechaInicio.Value.ToShortDateString + " y " + tFechaFin.Value.ToShortDateString
        hoja.Range("B2:h2").Font.Bold = True
        hoja.Range("B2:h2").Font.Size = 15

        '' Crear el subencabezado de nuestro informe

        Dim objCelda As Excel.Range = hoja.Range("A6", Type.Missing)
        objCelda.Value = "Número"
        objCelda = hoja.Range("B6", Type.Missing)
        objCelda.Value = "Calle"

        objCelda = hoja.Range("C6", Type.Missing)
        objCelda.Value = "Villa"

        objCelda = hoja.Range("D6", Type.Missing)
        objCelda.Value = "Fecha"

        objCelda = hoja.Range("e6", Type.Missing)
        objCelda.Value = "Hora"

        objCelda = hoja.Range("f6", Type.Missing)
        objCelda.Value = "Chofer"

        objCelda = hoja.Range("g6", Type.Missing)
        objCelda.Value = "Camión"

        objCelda = hoja.Range("h6", Type.Missing)
        objCelda.Value = "SubTotal"
        objCelda.EntireColumn.NumberFormat = "$ ###,###,##0"

        objCelda = hoja.Range("i6", Type.Missing)
        objCelda.Value = "Descuentos"
        objCelda.EntireColumn.NumberFormat = "$ ###,###,##0"

        objCelda = hoja.Range("j6", Type.Missing)
        objCelda.Value = "Total"
        objCelda.EntireColumn.NumberFormat = "$ ###,###,##0"

        objCelda = hoja.Range("k6", Type.Missing)
        objCelda.Value = "Pagado"
        objCelda.EntireColumn.NumberFormat = "$ ###,###,##0"

        objCelda = hoja.Range("l6", Type.Missing)
        objCelda.Value = "Pediente"
        objCelda.EntireColumn.NumberFormat = "$ ###,###,##0"

        objCelda = hoja.Range("m6", Type.Missing)
        objCelda.Value = "Descripción"

        objCelda = hoja.Range("n6", Type.Missing)
        objCelda.Value = "Cantidad"

        objCelda = hoja.Range("o6", Type.Missing)
        objCelda.Value = "Valor"
        objCelda.EntireColumn.NumberFormat = "$ ###,###,##0"

        objCelda = hoja.Range("p6", Type.Missing)
        objCelda.Value = "Forma de Pago"

        objCelda = hoja.Range("q6", Type.Missing)
        objCelda.Value = "Monto"
        objCelda.EntireColumn.NumberFormat = "$ ###,###,##0"

        objCelda = hoja.Range("r6", Type.Missing)
        objCelda.Value = "Fecha de Pago"

        Dim fin As Boolean = False
        Dim index As Integer = 7
        Dim totKilos As Long = 0
        For Each venta In _Lista
            With hoja
                .Cells(index, "A") = venta.Numero
                .Cells(index, "B") = venta.Calle
                .Cells(index, "C") = venta.Villa
                .Cells(index, "D") = venta.Fecha
                .Cells(index, "e") = venta.Hora
                .Cells(index, "f") = venta.Chofer
                .Cells(index, "g") = venta.Camion
                '.Cells(index, "h") = venta.FormaPago
                .Cells(index, "h") = CLng(venta.SubTotal)
                .Cells(index, "i") = CLng(venta.Descuentos)
                .Cells(index, "j") = CLng(venta.Total)
                .Cells(index, "k") = CLng(venta.Pagado)
                .Cells(index, "l") = CLng(venta.Pendiente)

                Dim index1 = index
                For Each detalle In venta.DetalleVenta
                    .Cells(index1, "m") = detalle.Descripcion
                    .Cells(index1, "n") = detalle.Cantidad
                    .Cells(index1, "o") = detalle.Valor
                    index1 += 1
                Next
                Dim index2 = index
                If Not IsNothing(venta.Pagos) Then
                    For Each pago In venta.Pagos
                        .Cells(index2, "p") = pago.FormaPago
                        .Cells(index2, "q") = pago.Monto
                        .Cells(index2, "r") = pago.Fecha
                        index2 += 1
                    Next
                End If
                If index1 > index2 Then
                    index = index1
                Else
                    index = index2
                End If
            End With
            totKilos += venta.Kilos
        Next


        'calcular los totales
        Dim fPagosList = FormaPagoBL.List
        Dim TotPagado As New Dictionary(Of String, Integer)
        Dim TotPendiente As New Dictionary(Of String, Integer)
        Dim TotTotal As New Dictionary(Of String, Integer)
        Dim Cantidad As New Dictionary(Of String, Long)

        For Each rec In _Lista
            If Not IsNothing(rec.Pagos) AndAlso rec.Pagos.Count > 0 Then
                For Each rec2 In rec.Pagos
                    For Each fpago In fPagosList
                        If rec2.FormaPago.Equals(fpago.DESCRIPCION) Then
                            If TotPagado.ContainsKey(fpago.DESCRIPCION) Then
                                TotPagado.Item(fpago.DESCRIPCION) += rec.Pagado
                            Else
                                TotPagado.Add(fpago.DESCRIPCION, 0)
                                TotPagado.Item(fpago.DESCRIPCION) += rec.Pagado
                            End If

                            If TotPendiente.ContainsKey(fpago.DESCRIPCION) Then
                                TotPendiente.Item(fpago.DESCRIPCION) += rec.Pendiente
                            Else
                                TotPendiente.Add(fpago.DESCRIPCION, 0)
                                TotPendiente.Item(fpago.DESCRIPCION) += rec.Pendiente
                            End If

                            If TotTotal.ContainsKey(fpago.DESCRIPCION) Then
                                TotTotal.Item(fpago.DESCRIPCION) += rec.Total
                            Else
                                TotTotal.Add(fpago.DESCRIPCION, 0)
                                TotTotal.Item(fpago.DESCRIPCION) += rec.Total
                            End If

                            If Cantidad.ContainsKey(fpago.DESCRIPCION) Then
                                Cantidad.Item(fpago.DESCRIPCION) += 1
                            Else
                                Cantidad.Add(fpago.DESCRIPCION, 0)
                                Cantidad.Item(fpago.DESCRIPCION) += 1
                            End If
                        End If

                    Next
                Next
            End If
        Next

        Dim indexOld = index
        index += 1
      
        hoja.Cells(index, "g") = "Formas de Pago"
        hoja.Cells(index, "h") = "Monto Total"
        hoja.Cells(index, "i") = "Monto Pagado"
        hoja.Cells(index, "j") = "Monto Pendiente"
        hoja.Cells(index, "k") = "Cantidad de Pagos"
        Dim indexI = index
        index += 1

        Dim totPe, totPa, totCan As Long
        Dim totalTotal As Integer = 0
        For Each tot In TotPagado
            hoja.Cells(index, "g") = tot.Key
            hoja.Cells(index, "i") = tot.Value
            For Each tota In TotPendiente
                If tot.Key = tota.Key Then
                    hoja.Cells(index, "j") = tota.Value
                    totPe += tota.Value
                End If
            Next
            For Each toto In TotTotal
                If tot.Key = toto.Key Then
                    hoja.Cells(index, "h") = toto.Value
                    totalTotal += toto.Value
                End If
            Next
            For Each cant In Cantidad
                If tot.Key = cant.Key Then
                    hoja.Cells(index, "k") = cant.Value
                    totCan += cant.Value
                End If
            Next
            index += 1
            totPa += tot.Value
        Next
        index += 1
        hoja.Cells(index, "g") = "Totales"
        hoja.Cells(index, "h") = totalTotal

        hoja.Cells(index, "i") = totPa

        hoja.Cells(index, "j") = totPe
        hoja.Cells(index, "k") = totCan
        index += 2
        hoja.Cells(index, "j") = "Cantidad de Ventas"
        hoja.Cells(index, "k") = _Lista.Count
        index += 1
        hoja.Cells(index, "j") = "Cantidad de Kilos"
        hoja.Cells(index, "k") = totKilos

        Dim rango As Excel.Range = hoja.Range("k" & (indexOld - 1).ToString & ":k" + index.ToString)
        rango.NumberFormat = "###,##0"

        Dim objRango As Excel.Range = hoja.Range("A6:r" & (indexOld - 1).ToString)
        objRango.Select()
        objRango.Columns.AutoFit()
        objRango.AutoFormat(CType(11, Excel.XlRangeAutoFormat), Alignment:=False)

        Dim objRango2 As Excel.Range = hoja.Range("g" + indexI.ToString + ":k" & (index).ToString)
        objRango2.Select()
        objRango2.Columns.AutoFit()
        objRango2.AutoFormat(CType(11, Excel.XlRangeAutoFormat), Alignment:=False)
        'objRango.AutoFilter(1, , VisibleDropDown:=True) '' Asignar filtro por columna
        'objRango = hoja.Range("D3")
        'objRango.ColumnWidth = 100

        m_Excel.Visible = True
        hoja.Name = "Listado General"
        'Try
        '    objLibroExcel.SaveAs("c:\Venta Diaria.xlsx")
        'Catch ex As Exception

        'End Try

        'm_Excel.Quit()
        m_Excel = Nothing
    End Sub
End Class